from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import render_template
from flask import request
from flask import session

from info import constants
from info import db
from info.models import Category, News
from info.utils.commons import login_required
from info.utils.image_storage import storage
from info.utils.response_code import RET
from . import profile_blue


@profile_blue.route('/info')
@login_required
def user_info():
    """
    用户基本信息
    1.尝试获取用户基本信息
    2.如果用户未登录，重定向到项目首页
    3.如果用户登录，调用模型类中的to_dict方法
    4.使用模板，返回用户的基本信息

    :return:
    """
    user=g.user
    if not user:
        return redirect('/')
    data={

        'user':user.to_dict()
    }
    return render_template('news/user.html',data=data)

@profile_blue.route('/base_info',methods=['GET','POST'])
@login_required
def base_info():
    """
      基本信息的完善
      1、尝试获取用户信息
      2、如果用户未登录，返回未登录信息
      3、判断请求方法，如果是get请求，
      4、要加载模板页面
      5、不是get请求，需要通过post请求进行数据交互
      6、获取参数
      7、检查参数的完整性
      8、检查参数，gender必须为man或women
      9、保存用户信息
      10、提交数据到数据库中
      11、修改redis缓存中的用户信息
      12、返回结果

      :return:
      """
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR,errmsg='用户未登录')

        # 判断请求方法如果为get请求，加载模板页面
    if request.method == 'GET':
        data = {
            'user': user.to_dict()
        }
        return render_template('news/user_base_info.html',data=data)

    nick_name=request.json.get('nick_name')
    signature=request.json.get('signature')
    gender=request.json.get('gender')

    #判断参数的完整性
    if not all([nick_name,signature,gender]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')

    if gender not in ['MAN','WOMAN']:
        return jsonify(errno=RET.PARAMERR, errmsg='参数格式错误')

    #保存用户信息
    user.nick_name=nick_name
    user.gender=gender
    user.signature=signature

    #提交到数据据库
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.rollback()
        return jsonify(errno=RET.DBERR,errmsg='保存数据失败')

    #过若提交成功，修改redis数据库中缓存的用户信息
    session['nick_name'] = user.nick_name

    return jsonify(errno=RET.OK, errmsg='OK')


# 调用七牛云用户上传头像
@profile_blue.route('/pic_info',methods=['GET','POST'])
@login_required
def pic_info():
    """
        用户上传头像
        1、尝试获取用户信息
        2、如果用户未登录，直接返回
        3、判断请求方法；
        4、如果为get请求，加载模板渲染页面
        5、获取参数，avatar
        6、判断参数是否存在
        7、读取图片数据，read()
        8、调用七牛云上传图片，保存七牛云返回的图片名称
        9、保存图片数据到mysql数据库中
        10、拼接图片的绝对路径
        绝对路径：七牛云的外链域名+图片名称
        11、返回图片

        :return:
        """
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg='用户未登录')

    if request.method=='GET':

        data={
            'user':user.to_dict()
        }

        return render_template('news/user_pic_info.html',data=data)

    #获取图片参数：
    avatar = request.files.get('avatar')

    #获取图片参数
    if not avatar:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    try:
        image=avatar.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数格式错误')

    #调用七牛云上传图片，保留七牛云返回的图片名陈
    try:
        image_name=storage(image)
    except Exception as e:
        current_app.logger.errro(e)
        return jsonify(errno=RET.THIRDERR,errmsg='上传图片异常')

    #保持图片数据到数据库中
    user.avatar_url=image_name

    #提交图片数据到数据库中
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg='保持数据失败')

    #拼接图片的绝对路径
    image_url=constants.QINIU_DOMIN_PREFIX+image_name
    return jsonify(errno=RET.OK,errmsg='ok',data={'avatar_url':image_url})



#密码修改
@profile_blue.route('/pass_info',methods=['GET','POST'])
@login_required
def pass_info():
    """
      密码修改
      1、判断用户登录
      2、如果是get请求，加载模板页面
      3、获取参数，old_password,new_password
      4、检查参数的完整性
      5、校验旧密码是否正确
      6、如果旧密码正确，保存新密码
      7、提交数据
      8、返回结果

      :return:
      """

    user=g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg='用户未登录')
    if request.method == 'GET':
        return render_template('news/user_pass_info.html')

    #获取参数
    old_password=request.json.get('old_password')
    new_password=request.json.get('new_password')

    if not all([old_password,new_password]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')

    #检查旧密码是否正确
    if not user.check_password(old_password):
        return jsonify(errno=RET.PWDERR, errmsg='密码错误')

    user.password=new_password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')

    return jsonify(errno=RET.OK, errmsg='OK')

@profile_blue.route('/news_release',methods=['GET','POST'])
@login_required
def news_release():
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg='用户未登录')

    if request.method=='GET':
        #加载新闻分类数据
        try:
            categories=Category.query.all()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg='查询分类数据异常')

        # 判断查询结果
        if not categories:
            return jsonify(errno=RET.NODATA, errmsg='无分类数据')

        category_list=[]
        for category in categories:
            category_list.append(category.to_dict())

        category_list.pop(0)
        data={
            'categories':category_list
        }
        return render_template('news/user_news_release.html',data=data)

    #获取参数
    # 获取参数,前端需要传新闻图片，使用的ajaxSubmit，需要使用form属性获取参数
    title = request.form.get('title')
    digest = request.form.get('digest')
    category_id = request.form.get('category_id')
    content = request.form.get('content')
    index_image = request.files.get('index_image')

    if not all([title,digest,category_id,content,index_image]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
 # 获取参数,前端需要传新闻图片，使用的ajaxSubmit，需要使用form属性获取参数
    title = request.form.get('title')
    digest = request.form.get('digest')
    category_id = request.form.get('category_id')
    content = request.form.get('content')
    index_image = request.files.get('index_image')
    # 检查参数的完整性
    if not all([title,digest,category_id,content,index_image]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    # 转换分类id的数据类型
    try:
        category_id = int(category_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg='参数格式错误')
    # 读取图片数据
    try:
        image_data = index_image.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg='参数格式异常')
    # 调用七牛云上传新闻图片
    try:
        image_name = storage(image_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg='上传图片异常')
    # 保存新闻数据
    news = News()
    news.title = title
    news.digest = digest
    news.category_id = category_id
    news.content = content
    news.index_image_url = constants.QINIU_DOMIN_PREFIX + image_name
    news.source = '个人发布'
    news.status = 1
    news.user_id = user.id
    # 提交数据到数据库中
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg='保存数据失败')
    # 返回结果
    return jsonify(errno=RET.OK,errmsg='OK')





